package rpcSer

import (
	"google.golang.org/grpc"
	"google.golang.org/grpc/reflection"
	"log"
	"net"
	"os"
	"os/signal"
)

func RegisterGrpg(port string, f func(ser *grpc.Server)) error {

	//创建tpc监听
	lis, err := net.Listen("tcp", "0.0.0.0:"+port)
	if err != nil {
		log.Println("创建rpc监听服务失败", err)
		return err
	}
	log.Println("创建rpc监听服务成功,监听端口:" + port)

	server := grpc.NewServer()
	//反射接口
	reflection.Register(server)
	f(server)

	//创建一个 gRPC 服务器并开始监听指定的网络地址（lis），以便接受客户端的 gRPC 连接请求。
	err = server.Serve(lis)
	if err != nil {
		log.Println("rpc服务启动失败", err)
		return err
	}

	defer lis.Close()

	//阻塞等待客户端断开连接--优雅断开连接

	//创建了一个类型为 os.Signal 的通道 quit。
	//通道是 Go 语言中用于在 goroutine 之间进行通信的机制，
	//而 os.Signal 类型用于表示操作系统发送的信号，如中断信号。
	quit := make(chan os.Signal)
	//signal.Notify 函数用于将操作系统发出的信号通知到指定的通道。
	//在这里，它将操作系统的中断信号（os.Interrupt）发送到 quit 通道中。
	signal.Notify(quit, os.Interrupt)
	//<-quit：这一行代码是一个接收操作，它会阻塞当前的 goroutine，直到从 quit 通道中接收到一个值。这里的目的是等待操作系统发出的中断信号。
	<-quit
	return nil
}
